home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 176-200 / disk_193 / keymaped / source / keymaped.c next >
C/C++ Source or Header  |  1992-05-06  |  7KB  |  270 lines

  1. /*
  2.  * Key Map Editor ver 1.0
  3.  *
  4.  * By: Tim Friest
  5.  * on: December 31, 1988
  6.  *
  7.  * Editor for standard Amiga Key Maps.  Allows custom key definitions.
  8.  * Produces files compatible with AmigaDOS SetMap command.
  9.  */
  10.  
  11. unsigned long    ResourceFlags = 0;
  12. unsigned long    StatusFlags = 0;
  13.  
  14. #include "KME_Includes.h"
  15. #include "KME_Protos.h"
  16. #include "KME_Defs.h"
  17. #include "KME_Menus.h"
  18. #include "KME_Gadgets.h"
  19. #include "KME_Window.h"
  20.  
  21. int    ReturnCode    = 0;
  22. struct    GfxBase    *GfxBase;
  23. struct    IntuitionBase    *IntuitionBase;
  24. struct    timerequest    *Timer;
  25. ULONG    Timer_sf    = 0;
  26. struct    TextAttr    Topaz8TextAttr = {
  27.     "topaz.font",    /* name */
  28.     8,        /* size */
  29.     FS_NORMAL,    /* style */
  30.     FPF_ROMFONT    /* flags */
  31. };
  32. struct    TextFont    *TopazFont;
  33. struct    Window    *KeyMapEdWindow;
  34. struct    Window    *FileReqWindow;
  35. struct    Window    *KeyReqWindow;
  36. BPTR    DirLock;
  37. BPTR    KeyMapSegment;
  38. struct    KeyMapNode    *KeyMapNode;
  39. struct    FileNode    *FileList = NULL;
  40. int    FileListLength    = 0;
  41. char    *filename = NULL;
  42.  
  43. unsigned long    Wind_sf = 0;
  44.  
  45. struct Gadget    *FromKeyGad = NULL;
  46.  
  47. extern    struct StringInfo    NameStrGadSInfo;
  48. extern    UBYTE FileNameBuff[30];
  49.  
  50. extern int main(int, char **);
  51. /*
  52.  * Key Map Editor Main procedure
  53.  *
  54.  * reads keymap filename from command line if supplied
  55.  */
  56. int main(argc, argv)
  57. int argc;
  58. char **argv;
  59. {
  60.     struct IntuiMessage *Message;
  61.     unsigned long    Class;
  62.     unsigned short    Code;
  63.     APTR    Address;
  64.     struct MenuItem *Item;
  65.     struct Gadget *Gad;
  66.     BPTR    OldDirLock, templock;
  67.  
  68. /*
  69.  * Get the Key Map Filename
  70.  */
  71.     if (argc > 1) {
  72.         if (strcmp(argv[1], "?") == 0) {
  73.             Write(Output(), "KeyMapEd ver 1.0 1-Jan-89\n", 26);
  74.             Write(Output(), "         by Tim Friest\n", 23);
  75.             Write(Output(), "Usage: KeyMapEd keymap\n", 23);
  76.             goto CleanUp;
  77.         }
  78.         filename = argv[1];
  79.     }
  80.  
  81. /*
  82.  * Change directory to devs:keymaps
  83.  */
  84.     if ((DirLock = Lock("devs:keymaps", SHARED_LOCK)) == NULL) {
  85.         ReturnCode = IoErr();
  86.         Write(Output(), "Unable to place lock on devs:keymaps\n", 37);
  87.         goto CleanUp;
  88.     }
  89.     FlagResource(RF_DirLock);
  90.     if ((OldDirLock = CurrentDir(DirLock)) == NULL) {
  91.         ReturnCode = IoErr();
  92.         Write(Output(), "Unable to CD to devs:keymaps\n", 29);
  93.         goto CleanUp;
  94.     }
  95.     FlagResource(RF_CurrentDir);
  96.  
  97. /*
  98.  * Open necessary libraries
  99.  */
  100.     if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0))
  101.          == NULL) {
  102.         Write(Output(), "Unable to open Graphics Library\n", 32);
  103.         goto CleanUp;
  104.     }
  105.     FlagResource(RF_Graphics);
  106.  
  107.     if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary(
  108.          "intuition.library", 0)) == NULL) {
  109.         Write(Output(), "Unable to open Intuition Library\n", 33);
  110.         goto CleanUp;
  111.     }
  112.     FlagResource(RF_Intuition);
  113.  
  114. /*
  115.  * Open necessary devices
  116.  */
  117.     if ((Timer = (struct timerequest *)CreateExtIO(CreatePort("Timer", 0), sizeof(struct timerequest))) == NULL) {
  118.         Write(Output(), "Unable to create timer ExtIO block\n", 35);
  119.         goto CleanUp;
  120.     }
  121.     if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)Timer, NULL)) {
  122.         Write(Output(), "Unable to open timer device\n", 28);
  123.         goto CleanUp;
  124.     }
  125.     Timer_sf = (1<<Timer->tr_node.io_Message.mn_ReplyPort->mp_SigBit);
  126.     FlagResource(RF_Timer);
  127.  
  128. /*
  129.  * Read in the Key Map
  130.  */
  131.     if (filename != NULL) {
  132.         strcpy(FileNameBuff, filename);
  133.         NameStrGadSInfo.BufferPos = strlen(filename);
  134.         if (ReadKeyMap(FileNameBuff))
  135.             UpdateDisplay(GadgetList, KeyMapNode, TRUE);
  136.         else
  137.             KeyMapIO(FileNameBuff, LOAD);
  138.     }
  139.     else
  140.         KeyMapIO(filename, LOAD);
  141.     if (!CheckResource(RF_KeyMap))
  142.         goto CleanUp;
  143.  
  144. /*
  145.  * Open the Key Map Editor window
  146.  */
  147.     if ((KeyMapEdWindow = OpenWindow(&NewKMEWindow)) == NULL) {
  148.         Write(Output(), "Unable to open window\n", 22);
  149.         goto CleanUp;
  150.     }
  151.     FlagResource(RF_Window);
  152.     Wind_sf = (1<<KeyMapEdWindow->UserPort->mp_SigBit);
  153.  
  154. /*
  155.  * Set font to Topaz 8 (so everything looks right)
  156.  */
  157.     if ((TopazFont = OpenFont(&Topaz8TextAttr)) != NULL) {
  158.         if (!SetFont(KeyMapEdWindow->RPort, TopazFont))
  159.             Write(Output(), "Unable to set font in Key Map Ed window\n", 40);
  160.         FlagResource(RF_Font);
  161.     }
  162.     else
  163.         Write(Output(), "Unable to open Topaz 8 font\n", 28);
  164.  
  165. /* Add menu to Window */
  166.  
  167.     SetMenuStrip(KeyMapEdWindow, MenuList);
  168.     FlagResource(RF_Menu);
  169.     SetFlag(SF_Define);
  170.  
  171. /*
  172.  * Process Inputs
  173.  */
  174.     while (Wait(Wind_sf) == Wind_sf) {
  175.         while ((Message = (struct IntuiMessage *)GetMsg(KeyMapEdWindow->UserPort)) != NULL) {
  176.             Class = Message->Class;
  177.             Code = Message->Code;
  178.             Address = Message->IAddress;
  179.             ReplyMsg((struct Message *)Message);
  180.             switch (Class) {
  181.                 case CLOSEWINDOW: /* CloseWindow gadget was hit */
  182.                     if (CheckFlag(SF_Modified)) {
  183.                         if (VerifyReq())
  184.                             goto CleanUp;
  185.                     }
  186.                     else
  187.                         goto CleanUp;
  188.                     break;
  189.                 case MENUPICK:    /* Menu Item was selected */
  190.                     while (Code != MENUNULL) {
  191.                         Item = ItemAddress(MenuList, Code);
  192.                         if (!ProcMenu(Code))
  193.                             goto CleanUp;
  194.                         Code = Item->NextSelect;
  195.                     }
  196.                     break;
  197.                 case GADGETUP:    /* Gadget was selected */
  198.                     Gad = (struct Gadget *)Address;
  199.                     ProcGadget(Gad);
  200.                     break;
  201.             } /* switch */
  202.         } /* while */
  203.     } /* while */
  204.  
  205. CleanUp:
  206.     if (CheckFlag(SF_Pointer))
  207.         ChangePointer(0);
  208.     if (CheckResource(RF_Timer)) {
  209.         CloseDevice((struct IORequest *)Timer);
  210.         DeletePort(Timer->tr_node.io_Message.mn_ReplyPort);
  211.         DeleteExtIO((struct IORequest *)Timer);
  212.         ClearResource(RF_Timer);
  213.     }
  214.     if (CheckResource(RF_FileList)) {
  215.         struct FileNode *temp;
  216.  
  217.         while (FileList != NULL) {
  218.             temp = FileList;
  219.             FileList = FileList->NextFile;
  220.             if (temp->FileName != NULL)
  221.                 FreeMem(temp->FileName, strlen(temp->FileName)+1);
  222.             FreeMem(temp, sizeof(struct FileNode));
  223.         }
  224.         ClearResource(RF_FileList);
  225.     }
  226.     if (CheckResource(RF_KeyMap))
  227.         FreeKeyMap(KeyMapNode);
  228.     if (CheckResource(RF_Menu)) {
  229.         ClearMenuStrip(KeyMapEdWindow);
  230.         ClearResource(RF_Menu);
  231.     }
  232.     if (CheckResource(RF_GadgetText)) {
  233.         Gad = GadgetList;
  234.         do
  235.             if (Gad->GadgetText != NULL) {
  236.                 if (Gad->GadgetText->IText != NULL)
  237.                     FreeMem(Gad->GadgetText->IText, strlen(Gad->GadgetText->IText)+1);
  238.                 FreeMem(Gad->GadgetText, sizeof(struct IntuiText));
  239.                 Gad->GadgetText = NULL;
  240.             }
  241.         while ((Gad = Gad->NextGadget) != NULL);
  242.         ClearResource(RF_GadgetText);
  243.     }
  244.     if (CheckResource(RF_Font)) {
  245.         CloseFont(TopazFont);
  246.         ClearResource(RF_Font);
  247.     }
  248.     if (CheckResource(RF_Window)) {
  249.         CloseWindow(KeyMapEdWindow);
  250.         ClearResource(RF_Window);
  251.     }
  252.     if (CheckResource(RF_Intuition)) {
  253.         CloseLibrary((struct Library *)IntuitionBase);
  254.         ClearResource(RF_Intuition);
  255.     }
  256.     if (CheckResource(RF_Graphics)) {
  257.         CloseLibrary((struct Library *)GfxBase);
  258.         ClearResource(RF_Graphics);
  259.     }
  260.     if (CheckResource(RF_CurrentDir)) {
  261.         templock = CurrentDir(OldDirLock);
  262.         ClearResource(RF_CurrentDir);
  263.     }
  264.     if (CheckResource(RF_DirLock)) {
  265.         UnLock(DirLock);
  266.         ClearResource(RF_DirLock);
  267.     }
  268.     return(ReturnCode);
  269. }
  270.